package createpattern.prototype.cloneable;
/**
 * 原型模式 - 用一个已经创建的实例作为原型，通过复制该原型对象来创建一个和原型对象相同的新对象。
 * 原型模式的克隆分为浅克隆和深克隆。
 * 浅克隆：创建一个新对象，新对象的属性和原来对象完全相同，对于非基本类型属性，仍指向原
 * 有属性所指向的对象的内存地址。
 * 深克隆：创建一个新对象，属性中引用的其他对象也会被克隆，不再指向原有对象地址
 *
 * Java中的Object类中提供了 clone() 方法来实现浅克隆。 Cloneable 接口是抽象原型类，
 * 而实现了Cloneable接口的子实现类就是具体的原型类。
 *
 * Cloneable 接口是一个标记接口（不包含任何方法），它告诉 JVM 该类允许自身的实例被克隆。
 * 如果一个类没有实现 Cloneable 接口，那么调用 clone() 方法时会抛出 CloneNotSupportedException 异常。
 * */
public class RealizeType implements Cloneable{

    public RealizeType() {
        System.out.println("具体的原型对象创建完成");
    }

    @Override
    protected RealizeType clone() throws CloneNotSupportedException {
        System.out.println("具体原型复制成功");
        return (RealizeType) super.clone();
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        RealizeType r1 = new RealizeType();
        RealizeType r2 = r1.clone();
        System.out.println(r1 == r2);
    }
}
